package demo2;

import java.util.Scanner;
//使用volatile解决问题

/**
 * 这里volatile修饰了flag，此时会有
 * volatile的直接可见性
 * 读屏障：对于flag的读取，会让缓存失效，每次都是从主内存中读取，每次都能读到最新的主内存中flag的值
 * 写屏障：对于flag的修改，修改后会立即将他写回主内存，所有线程中对于该变量的本地缓存会立即失效
 * volatile的可见性并不是“即时立马有效”，他保证的是下一次读取会读到最新的值，是针对
 * “后续的读取操作”，无法影响在修改前已经发生的读取
 */
public class DEMO_04 {
    static volatile int flag = 0;
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            System.out.println("t1线程启动");
            while (flag == 0) {
            }
            System.out.println("t1线程结束");
        });

        Thread t2 = new Thread(() -> {
            System.out.println("t2线程启动");
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个非零整数");
            flag = scanner.nextInt();
            System.out.println("t2线程结束");
        });
        //启动线程
        t1.start();
        t2.start();

    }
}
